import Config from '@/Config';
import Service from "../modules/Service";

/**
 * 上传数据类型
 */
interface IUploadRequest {
  /**
   * 资源名，必须是UTF-8编码。如果上传凭证中 scope 指定为 <bucket>:<key>， 则该字段也必须指定，并且与上传凭证中的 key 一致，否则会报403错误。如果表单没有指定 key，可以使用上传策略saveKey字段所指定魔法变量生成 Key，如果没有模板，则使用 Hash 值作为 Key。
   */
  resource_key?: string;

  /**
   * 上传凭证，位于 token 消息中。
   */
  upload_token: string;

  /**
   * 上传内容的 CRC32 校验码。如果指定此值，则七牛服务器会使用此值进行内容检验。
   */
  crc32?: string;

  /**
   * 当 HTTP 请求指定 accept 头部时，七牛会返回 Content-Type 头部值。该值用于兼容低版本 IE 浏览器行为。低版本 IE 浏览器在表单上传时，返回 application/json 表示下载，返回 text/plain 才会显示返回内容。
   */
  accept?: string;

  /**
   * 原文件名。对于没有文件名的情况，建议填入随机生成的纯文本字符串。本参数的值将作为魔法变量$(fname)的值使用。
   */
  fileName: string;

  /**
   * 上传文件的完整内容。
   */
  fileBinaryData: any;

  /**
   * 自定义元数据，可同时自定义多个元数据。
   */
  "x-qn-meta"?: any;
}

export default class QiniuyunService {
  private uploadService = new Service({
    baseUrl: new Config().QINIUYUN_UP_API,
    header: {}
  });

  public upload(options: IUploadRequest) {
    const formData = new FormData();
    options.resource_key ? formData.append("resource_key", options.resource_key) : "";
    formData.append("upload_token", options.upload_token);
    options.crc32 ? formData.append("crc32", options.crc32) : "";
    options.accept ? formData.append("accept", options.accept) : "";
    formData.append("fileName", options.fileName)
    formData.append("fileBinaryData", options.fileBinaryData)
    formData.append("x-qn-meta", options["x-qn-meta"]);
    return this.uploadService.post("", options, {
      header: {
        "Content-Type": "multipart/form-data"
      }
    });
  }
}